<?php

namespace fastphp;

use Exception;

class Router
{
    protected $routes = [];

    public function addRoute($pattern, $controller, $action)
    {
        $this->routes[] = new Route($pattern, $controller, $action);
    }

    /**
     * @throws Exception
     */
    public function match($requestUri)
    {
        foreach ($this->routes as $route) {
            // 这里使用简单的正则表达式匹配作为示例
            // 在实际应用中，你可能需要更复杂的匹配逻辑，比如使用第三方路由库
            if (preg_match('/^' . preg_quote($route->pattern, '/') . '$/', $requestUri, $matches)) {
                // 提取参数（如果有的话）
                if (count($matches) > 1) {
                    array_shift($matches); // 移除完整的匹配字符串
                    $route->parameters = array_combine(range(1, count($matches)), $matches);
                }
                return $route;
            }
        }
        // 如果没有匹配到任何路由，可以抛出一个异常或返回 null/false
        return null;
    }

    // 分发请求到相应的控制器和动作
    public function dispatch($requestUri)
    {
        if (!empty($requestUri)) {
            $route = $this->match($requestUri);
            if (empty($route)){
                require_once DefErrorPage;
                exit();
            }
            $controllerName = $route->controller;
            $actionName = $route->action;

            // 包含控制器文件（假设控制器位于特定的目录中）
            require_once APP_PATH . 'controllers/' . $controllerName . 'Controller' . '.php';

            // 实例化控制器并调用动作方法
            $controllerClass = ucfirst($controllerName) . 'Controller';
            $controller = new $controllerClass();

            // 传递参数给动作方法（如果有的话）
            $parameters = $route->parameters;

            // 调用动作方法并获取响应
            $response = call_user_func_array([$controller, $actionName], $parameters);

            // 发送响应（这里假设响应是一个字符串或可以转换为字符串的对象）
            echo $response;
        }else{
            require_once DefErrorPage;
        }
    }
}